package com.gitee.liuzhi.framework.starter.response.apiresult;

import com.gitee.liuzhi.framework.starter.response.enums.DataResultEnum;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/**
 * Created by 2022/4/24/0024
 *
 * @author LiuZhi
 * @version V1.0
 * @description: 包含返回数据的 Result
 */
@Getter
@Setter
@NoArgsConstructor
public class DataResult<T> extends BaseResult {

    /**
     * 实际返回数据
     */
    private T data;

    private DataResult(Object code, String message) {
        this.code = code;
        this.message = message;
    }

    private DataResult(Object code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 返回成功
     *
     * @return
     */
    public static DataResult success() {
        return new DataResult<>(DataResultEnum.INVOKE_SUCCESS.getCode(), DataResultEnum.INVOKE_SUCCESS.getMessage(), null);
    }

    /**
     * 返回带 data 的成功数据
     *
     * @param data
     * @return
     */
    public static <T> DataResult<T> success(T data) {
        return new DataResult<>(DataResultEnum.INVOKE_SUCCESS.getCode(), DataResultEnum.INVOKE_SUCCESS.getMessage(), data);
    }

    /**
     * 返回成功 自定义message
     *
     * @param message
     * @return
     */
    public static DataResult message(String message) {
        return new DataResult<>(DataResultEnum.INVOKE_SUCCESS.getCode(), message, "");
    }

    /**
     * 自定义 code 和message
     *
     * @param stateCode
     * @param message
     * @return
     */
    public static <E> DataResult result(E stateCode, String message) {
        return new DataResult(stateCode, message, null);
    }

    /**
     * 自定义 code和message 带 data
     *
     * @param code
     * @param message
     * @param data
     * @return
     */
    public static <T, E> DataResult<T> resultData(E code, String message, T data) {
        return new DataResult<>(code, message, data);
    }

    /**
     * 服务器错误
     *
     * @return
     */
    public static DataResult serverError() {
        return DataResult.result(DataResultEnum.UN_KNOW_ERROR.getCode(), DataResultEnum.UN_KNOW_ERROR.getMessage());
    }

    /**
     * 参数缺失
     *
     * @return
     */
    public static DataResult paramMiss() {
        return DataResult.result(DataResultEnum.PARAM_MISS.getCode(), DataResultEnum.PARAM_MISS.getMessage());
    }

    /**
     * 参数错误
     *
     * @return
     */
    public static DataResult parameterError() {
        return DataResult.result(DataResultEnum.INVALID_PARAMETER.getCode(), DataResultEnum.INVALID_PARAMETER.getMessage());
    }

    public Boolean successful() {
        return DataResultEnum.INVOKE_SUCCESS.getCode().equals(code);
    }


}
